/*************************************************************
 * Title: 
 * Description: 
 * Author: Snow Huang
 * Email: Shaobin.Software@gmail.com Shaobin_Software@163.com
 * CreateTime: Aug 11, 2010 3:13:35 PM
 * Copyright © 落羽社区 All right reserved
 ************************************************************/
package snow.core.util.algorithm.tree;

import java.io.Serializable;
import java.util.Set;

/**
 * 
 */
public interface Tree<T extends Tree<T>> extends Serializable {

	/**
	 * 添加子节点
	 * 
	 * @param tree
	 *            子节点
	 */
	public void addChild(T tree);

	/**
	 * @return 递归来获取所有子节点
	 */
	public Set<T> getAllChildren();

	/**
	 * @return 递归获取所有子节点中的叶子节点
	 */
	public Set<T> getAllLeaves();

	/**
	 * @return 获取直属子节点
	 */
	public Set<T> getChildren();

	/**
	 * @return 代码
	 */
	public String getCode();

	/**
	 * @return 其他描述
	 */
	public String getComments();

	/**
	 * @return 名称
	 */
	public String getName();

	/**
	 * @return 父节点
	 */
	public T getParent();

	/**
	 * @param tree
	 *            指定节点
	 * @return 是否为指定节点的子节点
	 */
	public boolean isChildOf(T tree);

	/**
	 * @return 是否为叶子节点
	 */
	public boolean isLeaf();

	/**
	 * @param tree
	 *            指定节点
	 * @return 是否为指定节点的父节点
	 */
	public boolean isParentOf(T tree);

	/**
	 * @return 是否为根节点
	 */
	public boolean isRoot();

	/**
	 * 删除指定节点
	 * 
	 * @param tree
	 *            指定节点
	 */
	public void removeChild(T tree);

	/**
	 * 设置父节点为指定节点
	 * 
	 * @param parent
	 *            指定节点
	 */
	public void setParent(T parent);

}
